from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
import uuid


class UserProfile(models.Model):
    """
    用户个人资料模型 - 扩展Django内置User模型
    存储用户的额外信息，如头像、性别、生日等
    """
    # 一对一关联Django内置User模型，当User删除时级联删除对应的Profile
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
    avatar = models.ImageField(upload_to='avatars/', blank=True, null=True)  # 用户头像，存储在media/avatars/目录
    GENDER_CHOICES = (
        ('M', '男'),
        ('F', '女'),
        ('O', '其他'),
    )
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES, blank=True)  # 性别选择
    birthday = models.DateField(blank=True, null=True)  # 出生日期
    bio = models.TextField(max_length=500, blank=True)  # 个人简介
    phone = models.CharField(max_length=15, blank=True)  # 手机号码
    email_verified = models.BooleanField(default=False)  # 邮箱是否已验证
    
    def __str__(self):
        return f"{self.user.username}的个人资料"


class EmailVerification(models.Model):
    """
    邮箱验证模型 - 存储邮箱验证相关信息
    用于实现用户注册后的邮箱验证功能
    """
    # 关联用户，使用外键，当用户删除时级联删除验证记录
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='email_verifications')
    token = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)  # 唯一验证令牌，使用UUID4生成
    created_time = models.DateTimeField(default=timezone.now)  # 创建时间
    expiration_time = models.DateTimeField()  # 过期时间
    is_used = models.BooleanField(default=False)  # 是否已使用
    
    def __str__(self):
        return f"{self.user.username}的邮箱验证"
    
    def save(self, *args, **kwargs):
        """
        重写save方法，自动设置过期时间
        在创建验证记录时，如果未指定过期时间，则设置为创建时间后24小时
        """
        # 设置过期时间为创建时间后24小时
        if not self.expiration_time:
            self.expiration_time = self.created_time + timezone.timedelta(hours=24)
        super().save(*args, **kwargs)
    
    @property
    def is_expired(self):
        """
        检查验证码是否已过期
        通过比较当前时间与过期时间判断
        """
        return timezone.now() > self.expiration_time


class Address(models.Model):
    """
    收货地址模型 - 存储用户的收货地址信息
    用于订单配送和用户地址管理
    """
    # 关联用户，使用外键，当用户删除时级联删除地址
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='addresses')
    receiver = models.CharField(max_length=50)  # 收货人姓名
    province = models.CharField(max_length=50)  # 省份
    city = models.CharField(max_length=50)  # 城市
    district = models.CharField(max_length=50)  # 区/县
    street = models.CharField(max_length=50, blank=True, null=True)  # 街道，可为空
    address = models.CharField(max_length=200)  # 详细地址
    zip_code = models.CharField(max_length=10, blank=True)  # 邮政编码，可为空
    phone = models.CharField(max_length=15)  # 联系电话
    is_default = models.BooleanField(default=False)  # 是否默认地址
    is_deleted = models.BooleanField(default=False)  # 是否已删除(软删除)
    created_time = models.DateTimeField(auto_now_add=True)  # 创建时间
    updated_time = models.DateTimeField(auto_now=True)  # 更新时间
    
    def __str__(self):
        return f"{self.receiver}的地址"
    
    class Meta:
        verbose_name = "收货地址"
        verbose_name_plural = "收货地址"
        ordering = ['-is_default', '-updated_time']  # 先按是否默认排序，再按更新时间降序排序
    
    def save(self, *args, **kwargs):
        """
        重写save方法，处理默认地址逻辑
        当一个地址被设为默认地址时，自动将该用户的其他地址设为非默认
        """
        # 如果设置为默认地址，则将用户的其他地址设置为非默认
        if self.is_default:
            Address.objects.filter(user=self.user, is_default=True, is_deleted=False).update(is_default=False)
        super().save(*args, **kwargs)